<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    function Cat(name, color) {
        // {}
        // {}[[Prototype]] = Cat.prototype
        // this -> {}

        this.name = name;
        this.color = color;

        // return this;
    }
    Cat.prototype.species = "猫科";
    Cat.prototype.call = function () {
        console.log("喵喵");
    }
    Cat.prototype.skill = function () {
        console.log("捉老鼠");
    }
    Cat.prototype.say = function () {
        // this指向调用此方法的实例化对象
        // console.log("this", this);
        console.log(this.name, this.color);
    }

    // 给Object的原型对象定义属性和方法(测试)
    Object.prototype.a = 1;
    Object.prototype.b = 2;


    // 注意:
    // 实例化对象可以通过原型属性[[Prototype]],找到创建它(该实例化对象)的构造函数的原型对象  
    // 1. 实例化对象 自己有 就找自己的
    // 2. 自己没有就找创建该实例化对象的构造函数的原型对象


    // Tom的原型链
    // Tom -> Cat.prototype ->  Object.prototype -> null

    var Tom = new Cat("Tom", "colorfulのblack");
    console.log(Tom);

    // 实例化对象属性和方法的链式查找机制 (原型链)
    // 1. 实例化对象 自己有 就找自己的
    // console.log(Tom.name, Tom.color);

    // 2. 自己没有就找创建该实例化对象的构造函数的原型对象  (Cat.prototype)
    // console.log(Tom.species);
    // console.log(Tom.call);
    // console.log(Tom.skill);
    // Tom.call();
    // Tom.say();   // 函数调用时属于谁 this就指向谁

    // 3. 如果构造函数的原型对象(Cat.prototype)上,也没有我们要找的属性?  找谁?
    // 原型对象(Cat.prototype) => 本质还是一个对象(实例化对象) =>  如果prototype找不到需要的属性或方法 => 通过原型属性[[Prototype]]找创建它(prototype)的构造函数的原型对象 ?
    // console.log(Cat.prototype);  // {constructor:Cat, [[Prototype]]:Object.prototype}

    // 问: 创建原型对象(prototype)的构造函数是谁?   => 上级构造函数Object
    // console.log(Cat.prototype.__proto__ === Object.prototype); // true

    // console.log(Tom.a);
    // console.log(Tom.b);

    // 4.如果构造函数Object的原型对象(Object.prototype)上,也没有我们要找的属性?  找谁?
    // 原型对象(Object.prototype) => 本质还是一个对象(实例化对象) =>  如果Object.prototype找不到需要的属性或方法 => 通过原型属性[[Prototype]]找创建它(Object.prototype)的构造函数的原型对象 ?  => 上级构造函数Object  => 矛盾(自己找自己  => 根本停不下来 => 设计有问题 => 死查找 => 电脑卡死)
    // console.log(Object.prototype);

    // 官方强制规定
    // console.log(Object.prototype.__proto__ === null);

    // console.log(Tom.hello);






    // var Kitty = new Cat("Kitty", "pink");
    // console.log(Kitty);







</script>

</html>